home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 64
/
PCMania CD64_1.iso
/
pcmania
/
demo64
/
graf.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1997-12-21
|
4KB
|
202 lines
{$G+}
unit graf;
INTERFACE
CONST
VGA :pointer=PTR($a000,$0);
TYPE
color = record
r,g,b : byte;
end;
paleta = array [0..255] of color;
PROCEDURE Set_vga;
PROCEDURE Set_text;
PROCEDURE Cls(color:byte;VAR donde);
PROCEDURE Flip(VAR desde,hasta);
PROCEDURE PutRGB(Color,R,G,B : Byte);
PROCEDURE GetRGB(Color:byte; VAR R, G, B:byte);
PROCEDURE Putpaleta(pal:paleta);
PROCEDURE Getpaleta(VAR pal:paleta);
PROCEDURE EsperaVGA;
PROCEDURE Lee_pcx(Var origen; espacio:word;VAR destino);
PROCEDURE Load_pcx (origen:String;VAR destino);
PROCEDURE Putpixel (X,Y : Integer; Col : Byte; where:word);
IMPLEMENTATION
PROCEDURE Set_vga; ASSEMBLER;
ASM
mov ax,13h
int 10h
END;
PROCEDURE Set_text; ASSEMBLER;
ASM
mov ax,3h
int $10
END;
PROCEDURE Cls(color:byte;VAR donde);ASSEMBLER;
ASM
les di,donde
mov al,byte ptr color
mov ah,al
db $66, $c1, $e0, $10
mov al,byte ptr color
mov ah,al
mov cx,16000
db $f3,$66,$ab
end;
Procedure Flip (VAR desde,hasta); Assembler;
ASM
mov bx,ds
lds si,desde
les di,hasta
mov cx,16000
db $f3,$66,$a5 {rep movsd}
mov ds,bx
end;
PROCEDURE PutRGB(Color,R,G,B : Byte);
BEGIN
Port[$3c8]:=Color;
Port[$3c9]:=R;
Port[$3c9]:=G;
Port[$3c9]:=B;
END;
PROCEDURE GetRGB(Color:byte; VAR R, G, B:byte);
BEGIN
Port[$3c7]:=Color;
R:=Port[$3c9];
G:=Port[$3c9];
b:=Port[$3c9];
END;
PROCEDURE PutPaleta (pal:paleta);
VAR
cont : integer;
BEGIN
for cont:=0 to 255 do
PutRGB(cont,pal[cont].r,pal[cont].g,pal[cont].b);
END;
PROCEDURE GetPaleta (VAR pal:paleta);
VAR
cont : integer;
BEGIN
for cont:=0 to 255 do
GetRGB(cont,pal[cont].r,pal[cont].g,pal[cont].b);
END;
PROCEDURE EsperaVGA; assembler;
asm
mov dx,3DAh
@l1:
in al,dx
and al,08h
jnz @l1
@l2:
in al,dx
and al,08h
jz @l2
end;
PROCEDURE Putpixel (X,Y : Integer; Col : Byte; where:word);ASSEMBLER;
ASM
mov ax,where
mov es,ax
mov bx,[X]
mov dx,[Y]
mov di,bx
mov bx, dx
shl dx, 8
shl bx, 6
add dx, bx
add di, dx
mov al, [Col]
mov es:[di],al
END;
Procedure Lee_pcx(Var origen; espacio:word;VAR destino);ASSEMBLER;
VAR
cont : word;
ASM
Push DS
mov ax,espacio
mov cont,ax
sub cont,769 {768}
lds si,origen
add si,cont
cld
mov cx,256
mov bx,0
xor ah,ah
@@divide:
mov dx,$3c8
mov al,bl
out dx,al
mov dx,$3c9
lodsb
shr al,2
out dx,al
lodsb
shr al,2
out dx,al
lodsb
shr al,2
out dx,al
add bx,1
sub cx,1
jnz @@divide
les di,destino
lds si,origen
add si,128
mov dx,cont
@bucle:
lodsb
cmp al,192
Jb @norepite
cmp si,dx
jz @end
sub al,192
mov cl,al
lodsb
jmp @escribe
@norepite:
mov cx,1
@escribe:
rep stosb
cmp si,dx
jz @end
jmp @bucle
@end:
pop ds
END;
PROCEDURE Load_pcx (origen:String;VAR destino);
VAR
pointr : Pointer;
fichero : file;
tamany : word;
BEGIN
assign (fichero,origen);
reset (fichero,1);
getmem (pointr,filesize(fichero));
blockread (fichero,pointr^,filesize(fichero),tamany);
lee_pcx (pointr^,tamany,destino);
Freemem (pointr,filesize(fichero));
close (fichero);
end;
begin
end.